#include <iostream>
#include <fcntl.h>    // open
#include <unistd.h>   // close
#include <sys/mman.h> // mmap, munmap
#include <sys/stat.h> // stat
#include <cstring>    // strerror
#include <cerrno>     // errno

// 简单日志宏（模拟）
#define LOG_INFO(msg) std::cout << "[INFO] " << msg << std::endl
#define LOG_ERROR(msg) std::cerr << "[ERROR] " << msg << ": " << strerror(errno) << std::endl

void readFileWithMmap(const char* filePath) {
    // 1. 打开文件
    int fd = open(filePath, O_RDONLY);
    if (fd < 0) {
        LOG_ERROR("Failed to open file");
        return;
    }

    // 2. 获取文件状态（大小等）
    struct stat fileStat;
    if (stat(filePath, &fileStat) < 0) {
        LOG_ERROR("Failed to stat file");
        close(fd);
        return;
    }

    // 检查文件是否为空
    if (fileStat.st_size == 0) {
        LOG_INFO("File is empty");
        close(fd);
        return;
    }   

    // 3. 将文件映射到内存
    void* mapped = mmap(nullptr, fileStat.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
    if (mapped == MAP_FAILED) {
        LOG_ERROR("Failed to map file");
        close(fd);
        return;
    }

    // 转换为 char* 以便操作
    char* fileContent = static_cast<char*>(mapped);

    // 4. 读取并打印文件内容
    LOG_INFO("File content:");
    std::cout << std::string(fileContent, fileStat.st_size) << std::endl;

    // 5. 解除映射
    if (munmap(mapped, fileStat.st_size) == -1) {
        LOG_ERROR("Failed to unmap file");
    }

    // 6. 关闭文件
    close(fd);
    LOG_INFO("File operation completed");
}

int main() {
    const char* filePath = "example.txt"; // 请确保此文件存在
    readFileWithMmap(filePath);
    return 0;
}